// vite-user-config
import { loadEnv } from "vite";
import type {
    //
    AliasOptions,
    BuildEnvironmentOptions,
    BuilderOptions,
    CSSOptions,
    DepOptimizationOptions,
    DevEnvironmentOptions,
    EnvironmentOptions,
    ESBuildOptions,
    ExperimentalOptions,
    Logger,
    LogLevel,
    LegacyOptions,
    HTMLOptions,
    JsonOptions,
    PluginOption,
    PreviewOptions,
    ResolveOptions,
    ServerOptions,
    AppType,
    SSROptions,
    UserConfig,
    ConfigEnv,
} from "vite";

import type { ViteEnv } from "../types";

interface FutureOptions {
    removePluginHookHandleHotUpdate?: "warn";
    removePluginHookSsrArgument?: "warn";
    removeServerModuleGraph?: "warn";
    removeServerHot?: "warn";
    removeServerTransformRequest?: "warn";
    removeSsrLoadModule?: "warn";
}
type AllResolveOptions = ResolveOptions & {
    alias?: AliasOptions;
};

/**
 * 'spa' | 'mpa' | 'custom'
 * Whether your application is a Single Page Application (SPA),
 * a Multi-Page Application (MPA), or Custom Application (SSR
 * and frameworks with custom HTML handling)
 * @default 'spa'
 */
const appTypeOptions: AppType = "spa";

/**
 * 指定附加的 picomatch patterns 作为静态资产处理
 */
const assetsIncludeOptions: string | RegExp | (string | RegExp)[] = [];

/**
 * 项目根目录
 *
 * @description 可以是绝对路径或者相对于配置文件 (e.g. vite.config.ts) 所在位置的路径
 * @default process.cwd()
 */
const rootOptions: string = "";
/**
 * 基础公共路径
 * @default '/'
 */
const baseOptions: string = "/";
/**
 * 目录作为纯静态资源
 * @description
 * - 此目录中的文件将被直接复制到构建的dist目录中。
 * - 该值可以是绝对文件系统路径，也可以是相对于项目根目录的路径。
 * - 设置为`false`或空字符串，以禁用复制静态资源到构建dist目录。
 * @default 'public'
 */
const publicDirOptions: string | false = "public";

/**
 * 用于保存缓存文件的目录
 * @description
 * - 此目录中的文件是预捆绑的依赖项或其他由vite生成的缓存文件，可以提高性能。
 * - 您可以使用`--force`标志或手动删除目录以重新生成缓存文件。
 * - 该值可以是绝对文件系统路径，也可以是相对于项目根目录的路径。
 * - 未检测到`package.json`时，默认为`vite`。
 * @default 'node_modules/.vite'
 */
const cacheDirOptions: string = "node_modules/.vite";
/**
 * 显式设置要运行的模式。
 * @description 这将覆盖每个命令的默认模式，并且可以被命令行 --mode 选项覆盖。
 */
const modeOptions: string = "";
/**
 * vite 插件数组
 */
const pluginsOptions: PluginOption[] = [];
/**
 * HTML相关选项
 */
const htmlOptions: HTMLOptions = {};
/**
 * CSS 相关选项
 */
const cssOptions: CSSOptions = {};
/**
 * JSON loading options
 */
const jsonOptions: JsonOptions = {};
/**
 * 转换选项以传递给esbuild
 */
const esbuildOptions = (viteEnv: ViteEnv): ESBuildOptions | false => {
    return {
        pure: ["console.log", "console.trace"],
    };
};
/**
 * Builder specific options
 * @experimental
 */
const builderOptions: BuilderOptions = {};
/**
 * 服务器特定选项, e.g. host, port, https...
 */
const serverOptions: ServerOptions = {};
/**
 * 预览特定选项, e.g. host, port, https...
 */
const previewOptions: PreviewOptions = {};
/**
 * 实验功能
 * Features under this field could change in the future and might NOT follow semver.
 * Please be careful and always pin Vite's version when using them.
 * @experimental
 */
const experimentalOptions: ExperimentalOptions = {};
/**
 * Options to opt-in to future behavior
 */
const futureOptions: FutureOptions = {};
/**
 * Legacy options
 *
 * Features under this field only follow semver for patches, they could be removed in a
 * future minor version. Please always pin Vite's version to a minor when using them.
 */
const legacyOptions: LegacyOptions = {};
/**
 * Log level. => 'error' | 'warn' | 'info' | 'silent'
 * @default 'info'
 */
const logLevelOptions: LogLevel = "info";
/**
 * Custom logger.
 */
const customLoggerOptions: Logger | undefined = undefined;
/**
 * @default true
 */
const clearScreenOptions: boolean = true;
/**
 * 环境文件目录
 * @description  可以是绝对路径或根目录的相对路径
 * @default root
 */
const envDirOptions: string = "";
/**
 * 环境变量以 `envPrefix` 开头，将通过 import.meta.env 在客户端源代码中公开。
 * @default 'VITE_'
 */
const envPrefixOptions: string | string[] = "VITE_";
/**
 * Worker bundle options
 */
// worker?: {
//     /**
//      * Output format for worker bundle
//      * @default 'iife'
//      */
//     format?: 'es' | 'iife';
//     /**
//      * Vite plugins that apply to worker bundle. The plugins returned by this function
//      * should be new instances every time it is called, because they are used for each
//      * rollup worker bundling process.
//      */
//     plugins?: () => PluginOption[];
//     /**
//      * Rollup options to build worker bundle
//      */
//     rollupOptions?: Omit<RollupOptions, 'plugins' | 'input' | 'onwarn' | 'preserveEntrySignatures'>;
// };
/**
 * Dep optimization options
 */
const optimizeDepsOptions: DepOptimizationOptions = {};
/**
 * SSR specific options
 * We could make SSROptions be a EnvironmentOptions if we can abstract
 * external/noExternal for environments in general.
 */
const ssrOptions: SSROptions = {};
/**
 * Environment overrides
 */
const environmentsOptions: Record<string, EnvironmentOptions> = {};
/**
 *
 */
const resolveOptions: AllResolveOptions = {};
/**
 * Build specific options
 */
const buildOptions: BuildEnvironmentOptions = {};
/**
 * Dev specific options
 */
const devOptions: DevEnvironmentOptions = {};

const temp: UserConfig = {
    root: "",
    ssr: {},
    dev: {},
};

/**
 * 自定义选项
 */
const defineOptions: Record<string, any> = {
    DEMO_BOOL: true,
    DEMO_NUMBER: 20,
    DEMO_ARRAY: [1, 2, 3],
    DEMO_OBJECT: { name: "asc" },
    DEMO_STRING: JSON.stringify("This is demo string..."),
};

/**
 * UserConfig 公共配置
 */
const commonConfig: UserConfig = {
    appType: appTypeOptions,
    assetsInclude: assetsIncludeOptions,
    publicDir: publicDirOptions,
    // build: {
    //     chunkSizeWarningLimit: 2000,
    //     reportCompressedSize: false,
    //     sourcemap: false,
    // },
};

export {
    //
    defineOptions,
    esbuildOptions,
    rootOptions,
};

// function buildUserConfig(mode: string): UserConfig {
//     const MODE = mode ?? "development"
//     const isDevelopment = MODE === "development"
//     const viteEnv = loadViteEnv(MODE, EnvDir)
//     // console.log(mode)
//     // console.log(isDevelopment)
//     //
//     const result: UserConfig = {
//         appType: "spa", // APP 类型
//         root: AppRoot, // 项目根目录（index.html 文件所在的位置）
//         envDir: EnvDir, // 环境文件(.env.*)目录
//         cacheDir: CacheDir, // 存储缓存文件的目录
//         publicDir: PublicDir, // 静态资源服务的文件夹, 在构建期间复制到 build.outDir 的根目录
//         mode: MODE, // be overridden by the command line --mode option.
//         assetsInclude: [], // 包含的资产

//         resolve: {
//             alias: {
//                 ["#"]: SRC,
//                 ["vue-i18n"]: "vue-i18n/dist/vue-i18n.cjs.js" // 解决i8n警告 ...vue-i18n.esm-bundler.js
//             },
//             // 导入时想要省略的扩展名列表
//             extensions: [".mjs", ".js", ".mts", ".ts", ".jsx", ".tsx", ".json"]
//         },

//         css: {
//             // CSS 模块化
//             modules: {
//                 scopeBehaviour: "global" // 'global' | 'local'
//             },
//             // CSS 预处理器的选项
//             preprocessorOptions: {
//                 scss: {
//                     // 隐藏警告
//                     // Deprecation Warning: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0.
//                     api: "modern-compiler"
//                     // 预编译支持 scss
//                     // additionalData: `@use "~/styles/element/index.scss" as *;`,
//                     // additionalData: '@import "@/styles/variables.module.scss";',
//                     // javascriptEnabled: true, // 支持内联 JavaScript
//                 },
//                 less: {
//                     // 预编译支持less
//                     // additionalData: '@import "@/styles/variables.module.less";',
//                     // javascriptEnabled: true, // 支持内联 JavaScript
//                 }
//             },
//             // CSS sourcemaps enabled during dev
//             devSourcemap: true
//         },

//         plugins: [
//             vue(),
//             vueJsx(),
//             vueDevTools()
//             // AutoImport({
//             //     imports: ["vue"],
//             //     dts: "src/autotypes/auto-imports.d.ts",
//             //     resolvers: [ElementPlusResolver()],
//             // }),
//             // Components({
//             //     dts: "src/autotypes/auto-components.d.ts",
//             //     resolvers: [
//             //         // 自动导入 Element Plus 组件
//             //         ElementPlusResolver({ importStyle: "sass" }),
//             //     ],
//             // }),
//             // 按需导入图标
//             // Icons(),
//             // HTML
//             // createHtmlPlugin({
//             //     minify: true,
//             //     inject: {
//             //         data: {
//             //             app_title: viteEnv.VITE_APP_TITLE,
//             //         },
//             //     },
//             // }),
//             // 使用本地 svg 作为图标 icon
//             // createSvgIconsPlugin({
//             //     iconDirs: SvgIconDirs,
//             //     symbolId: "icon-[dir]-[name]",
//             // }),
//             // 静态资源拷贝
//             // viteStaticCopy({
//             //     targets: [{ src: ["LICENSE"], dest: "" }],
//             // }),
//         ],

//         /** Server Options */
//         server: {
//             host: "0.0.0.0", // 项目运行地址，此处代表 localhost
//             port: viteEnv.VITE_PORT, // 项目运行端口 default = 5173 ()
//             open: viteEnv.VITE_OPEN, // 运行 npm run dev 时是否自动打开浏览器
//             hmr: viteEnv.VITE_HMR, // 是否开启热加载
//             strictPort: false, // 设为 true 时若端口已被占用则会直接退出
//             https: undefined, // 启用 TLS + HTTP/2
//             cors: true, // 默认启用并允许任何源
//             proxy: undefined // 跨域代理配置,期望接收一个 { key: options }
//         },

//         build: {
//             outDir: OutDir, // 指定输出路径, 默认 dist
//             minify: isDevelopment ? false : "esbuild", // specify the minifier to use
//             assetsDir: OUT_ASSETS_FOLDER, // 指定生成静态资源的存放路径 (相对于 build.outDir)
//             cssCodeSplit: true, // 配置 CSS 代码拆分
//             sourcemap: false, // 构建后是否生成 source map 文件, default false
//             manifest: true, // 构建后将会生成 manifest.json 文件, 默认 false (OUT/.vite/manifest.json)
//             copyPublicDir: true, // 在构建阶段将 public 目录中的所有文件复制到 outDir 目录中
//             chunkSizeWarningLimit: 1500, // 调整区块大小警告限制 (in kbs).
//             rollupOptions: {
//                 input: undefined, // /path/to/your/index.html
//                 // 自定义底层的 Rollup 打包配置
//                 output: {
//                     entryFileNames: `${OUT_ASSETS_FOLDER}/js/entry-[name]-[hash].js`,
//                     chunkFileNames: `${OUT_ASSETS_FOLDER}/js/chunk-[name]-[hash].js`,
//                     assetFileNames: `${OUT_ASSETS_FOLDER}/[ext]/[name]-[hash].[ext]`,
//                     // https://rollupjs.org/guide/en/#outputmanualchunks
//                     manualChunks: {
//                         // "group-hooks": ["./src/hooks"],
//                         // "group-widgets": ["./src/widgets"],
//                         // "group-utils": ["./src/utils"],
//                     }
//                 },
//                 external: []
//             }
//         },

//         esbuild: {
//             // 打包去除 console.log 等调式信息
//             pure: viteEnv.VITE_DROP_CONSOLE ? ["console.log", "console.trace"] : []
//         },

//     }

//     return result as UserConfig
// }
